form验证实例
创建项目
django-admin startproject Mydjangocd Mydjangopython manage.py startapp APP
项目架构
[其它保持默认的忽略未显示]
Mydjango APP migrations 0001_initial.py __init__.py static __init__.py jquery-3.3.1.min.js templates add_user.html edit_user.html user.html admin.py apps.py models.py views.py Mydjango settings.py urls.py db.sqlite3
add_user.html
this from login 这是添加用户的页面
edit_user.html
this from login 这是编辑中的页面
{% csrf_token %}
users.html
this is user list
序列号 | 用户名 | 密码 | 性别 | 地区 | 年龄 | 邮箱 | 操作 | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
{ { row.id }} | { { row.user }} | { { row.pwd }} | {% if row.gen == True %}女 | {% else %}男 | {% endif %} {% if row.area == "0" %}华南 | {% elif row.area == "1" %}华北 | {% elif row.area == "2" %}华中 | {% elif row.area == "3" %}华东 | {% else %}华西 | {% endif %}{ { row.age }} | { { row.email }} | 编辑|删除 |
models.py
# -*- coding:utf8 -*-from django.db import modelsclass User_tab(models.Model): #创建用户表 user = models.CharField(max_length=18,) #用户字段 pwd = models.CharField(max_length=32,) #密码字段 gen = models.BooleanField() #性别字段 area = models.CharField(max_length=18,) #地区字段 age = models.IntegerField() #年龄字段 email = models.EmailField() #邮箱字段
views.py
# -*- coding:utf8 -*-from django.shortcuts import render,redirect,HttpResponsefrom APP import modelsfrom django import formsfrom django.forms import fields,widgetsfrom django.core.exceptions import ValidationErrorclass From_check(forms.Form): #继承forms模块 #利用froms模块进行数据验证,变量名和前端name属性保持一致# start --------------------------------- forms模块数据验证 ------------------------------ # 【注意,验证字段为了写入数据库方便,需要和数据库中数据字段保持一致!】 # 限制类型-字符串最大长度最小长度,且不能为空 user = fields.CharField( label="用户", max_length=18, min_length=2, required=True, error_messages={ 'required':'用户名不能为空', 'max_length':'用户名不能超过18个字符', 'min_length':'用户名不能小于2个字符', } ) # 限制类型-字符串最小长度为8,且不能为空 pwd = fields.CharField( label="密码", max_length=32, min_length=8, required=True, error_messages = { 'required': '密码不能为空', 'max_length': '密码不能超过32个字符', 'min_length': '密码不能小于8个字符', } ) gen = fields.ChoiceField( label="性别", choices=((0,'男'),(1,'女'),), initial=0, widget=widgets.RadioSelect, error_messages={ 'required': '性别是必选项' } ) area = fields.ChoiceField( label="地区", choices=[(0,'华南'),(1,'华北'),(2,'华中'),(3,'华东'),(4,'华西')], #如果从数据库中获取choices必须是列表格式,示例写法:【也可以使用ModelChoiceField方式从数据库获取】 #models.User_tab.objects.objects.values_list('id','username') initial=2, error_messages={ 'required':'' } ) #配合从数据库调取数据实时更新展现前端页面用法 # def __init__(self, *args,**kwargs): # super(From_check, self).__init__(*args,**kwargs) #拷贝所有静态属性赋值给fields # self.fields['area'].widget.choices=models.User_tab.objects.objects.values_list('id','username') # 限制类型-整型,且不能为空 age = fields.IntegerField( label="年龄", max_value=60, min_value=18, required=True, error_messages={ 'required': '年龄不能为空', 'max_value':'老爷爷不要玩儿网络啦~', 'min_value':'未成年不能玩儿网络!!!', 'invalid':'年龄格式有问题,必须为数字', } ) # 限制类型-邮箱,且不能为空 email = fields.EmailField( label="邮箱", required=True, error_messages={ 'required': '邮箱不能为空', 'invalid': '邮箱格式有问题', } ) def clean(self): # Django预留扩展验证函数 value_dict = self.cleaned_data # 其他验证通过的数据 v1 = value_dict.get('user') # 拿到验证通过的 username 字段数据,用于再次验证 v2 = value_dict.get('email') # 拿到验证通过的 email 字段数据,用于再次验证 print("验证通过的用户名是:", v1, "邮箱是", v2) d1 = models.User_tab.objects.filter(user=v1).count() # 获取数据库中用户名出现次数 d2 = models.User_tab.objects.filter(email=v2).count() # 获取数据库中邮箱出现次数 print("数据库获取v1是否存在", d1, "数据库获取v2是否存在", d2) if d1 != 0 or d2 != 0: # 判断用户名和邮箱在数据库中是否存在 raise ValidationError('此用户或邮箱已经被占用!') return self.cleaned_data# end --------------------------------- forms模块数据验证 ------------------------------def Data_sub(request): if request.method == "GET": data_obj = From_check() #经过验证,包含未验证通过的错误信息 return render(request, "add_user.html", {"data_obj": data_obj}) else: data_obj = From_check(request.POST,request.FILES) #拿到from获取到的所有数据(post数据和file数据) if data_obj.is_valid(): #判断是否验证成功 print("验证成功:",data_obj.cleaned_data) #已经验证成功后用户的正确数据【字典形式】 models.User_tab.objects.create(**data_obj.cleaned_data) #验证通过的数据写入数据库【使用**数据可避免单个字段写入】 return redirect("/users.html") else: print("验证错误:",data_obj.errors) #验证失败返回的错误信息 return render(request,"add_user.html",{"data_obj":data_obj}) #将验证数据传输到前端页面,便于取验证通过的数据和错误反馈信息def Query_users(request): user_list = models.User_tab.objects.all() return render(request, "users.html",{'user_list':user_list,})def Edit_user(request,nid): if request.method == "GET": data = models.User_tab.objects.filter(id=nid).first() #数据库中查询该ID所有字段 print("编辑字段",data) data_obj = From_check({'user':data.user,'pwd':data.pwd,'age':data.age,'email':data.email,}) #拿到需要编辑的对象 return render(request,"edit_user.html",locals()) #传送前端页面可利用from组件模块生成html else: print("获取编辑后的数据:",request.POST.get,nid) data_obj = From_check(request.POST) if data_obj.is_valid(): #判断是否验证成功 print("验证成功:",data_obj.cleaned_data) #已经验证成功后用户的正确数据【字典形式】 models.User_tab.objects.filter(id=nid).update(**data_obj.cleaned_data) #验证通过的数据写入数据库【使用**数据可避免单个字段写入】 return redirect("/users.html") else: print("验证错误:",data_obj.errors) #验证失败返回的错误信息 return render(request,"edit_user.html",locals()) #将验证数据传输到前端页面,便于取验证通过的数据和错误反馈信息def Del_user(request): nid = request.GET .get('nid') print("删除ID是:",nid) models.User_tab.objects.filter(id=nid).delete() return HttpResponse("删除成功!!!")
settings.py
INSTALLED_APPS
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'APP',]
TEMPLATES
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'APP/templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, },]
STATIC_URL
STATIC_URL = '/static/'
urls.py
# -*- coding:utf8 -*-from django.contrib import adminfrom django.urls import path,re_pathfrom APP import viewsurlpatterns = [ path('admin/', admin.site.urls), re_path('^add_user.html$',views.Data_sub), re_path('^users.html$',views.Query_users), re_path('^edit_user-(\d+).html$',views.Edit_user), #获取编辑的用户id re_path('^del_user.html$',views.Del_user),]
生成数据表测试
生成数据表
python manage.py makemigrations APPpython manage.py migrate
运行项目
python manage.py runserver